#pragma once

#include "noncopyable.h"
#include "EventLoop.h"
#include "Thread.h"

#include <functional>
#include <mutex>
#include <condition_variable>
#include <string>

class EventLoop;

class EventLoopThread : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop*)>;

    /**
     * ThreadInitCallback() 表示一个默认构造的 ThreadInitCallback 对象，即一个空的 std::function。
     * 如果在调用 EventLoopThread 的构造函数时没有提供 cb 参数，它将被默认构造为一个空的 std::function，
     * 这意味着没有函数被关联到这个函数对象上。
    */
    EventLoopThread(const ThreadInitCallback& cb = ThreadInitCallback(),
        const std::string& name = std::string());
    ~EventLoopThread();

    EventLoop* startLoop();
private:
    void threadFunc();

    EventLoop *loop_;
    //是否退出
    bool exiting_;
    Thread thread_;
    std::mutex mutex_;
    std::condition_variable cond_;
    ThreadInitCallback callback_;

};